package controllers

import (
	"ginstudydemo.com/main/models"
	"ginstudydemo.com/main/service"
	"github.com/gin-gonic/gin"
)

type IDeptController interface {
}

type DeptController struct{}

func NewDeptController() *DeptController {
	return &DeptController{}
}

// GetDept 获取部门列表
func (m DeptController) GetDept(c *gin.Context) {

	var query models.GetDeptQuery
	// 获取查询参数（除分页参数）
	if sbqErr := c.ShouldBindQuery(&query); sbqErr != nil {
		service.ReturnErr(c, "9999", sbqErr)
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}

	res, modelErr := models.GetDept(query)
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "查询错误#"+modelErr.Error())
		c.Abort()
		return
	}

	treeRes := models.GetTreeNodesDept(0, *res)

	service.ReturnSuccess[[]models.GetDeptRes](c, "2000", "用户ok", treeRes)
}

// GetDeptOptions 获取部门下拉列表
func (m DeptController) GetDeptOptions(c *gin.Context) {

	res, modelErr := models.GetDeptOptions()
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "查询错误#"+modelErr.Error())
		c.Abort()
		return
	}

	treeRes := models.GetTreeNodesDeptOptions(0, *res)

	service.ReturnSuccess[[]models.GetDeptOptionsRes](c, "2000", "用户ok", treeRes)

}

// GetDeptForm 获取菜单表单数据
func (m DeptController) GetDeptForm(c *gin.Context) {

	id := c.Param("deptId")

	res, modelErr := models.GetDeptInfoById(id)
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "查询错误#"+modelErr.Error())
		c.Abort()
		return
	}

	service.ReturnSuccess[models.DeptFormData](c, "2000", "用户ok", *res)

}

// AddDept 新增部门
func (m DeptController) AddDept(c *gin.Context) {

	//使用数据表结构体获取参数
	param := &models.AddDeptBody{}
	// 把结构体指针传入BindJSON，这样param的值才能同步修改
	cErr := c.BindJSON(param)
	if !(cErr == nil) {
		service.ReturnErr(c, "5000", cErr)
		c.Abort()
		return
	}

	menuId, modelErr := models.AddDept(*param)
	if !(modelErr == nil) {
		service.ReturnErr(c, "5000", modelErr)
		c.Abort()
		return
	}

	service.ReturnSuccess[int64](c, "2000", "用户ok", menuId)
}

// EditDept 修改菜单
func (m DeptController) EditDept(c *gin.Context) {

	ParamId := c.Param("deptId")

	//使用数据表结构体获取参数
	param := &models.AddDeptBody{}
	// 把结构体指针传入BindJSON，这样param的值才能同步修改
	cErr := c.BindJSON(param)
	if !(cErr == nil) {
		service.ReturnErr(c, "5000", cErr)
		c.Abort()
		return
	}
	//
	modelErr := models.EditDept(*param, ParamId)
	if !(modelErr == nil) {
		service.ReturnErr(c, "5000", modelErr)
		c.Abort()
		return
	}

	service.ReturnSuccess(c, "2000", "用户ok", struct{}{})
}

// DelDept 删除部门
func (m DeptController) DelDept(c *gin.Context) {
	ids := c.Param("ids")

	if ids == "" {
		service.ReturnErr(c, "9999", "error:ids为空")
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}

	modelErr := models.DelDept(ids)
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "error:系统错误#"+modelErr.Error())
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}
	service.ReturnSuccess(c, "2000", "ok", struct{}{})
}
